package me.ree.zkproduct.generator;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.config.rules.DbColumnType;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import me.ree.zkproduct.enums.DbStatusEnum;

import java.sql.Types;
import java.util.Map;

public class MybatisPlusGenerator {
    /* 数据库 */
    private static String DB_URL = "jdbc:mysql://127.0.0.1:3306/test_zk?useUnicode=true&characterEncoding=UTF-8&useSSL=false";

    private static String DB_USER_NAME = "test";

    private static String DB_PASSWORD = "test123";


    // 作者
    private static String AUTHOR = "ree";

    // 生成的文件的输出目录的根目录
    private static String OUTPUT_ROOT_DIR = "/Users/rui/demo/zk/zk-product";


    public static void main(String[] args) {
        FastAutoGenerator.create(DB_URL, DB_USER_NAME, DB_PASSWORD)
                .globalConfig(builder -> {
                    builder.author(AUTHOR) // 设置作者
                            .enableSwagger() // 开启 swagger 模式
                            .outputDir(OUTPUT_ROOT_DIR); // 指定输出目录
                })
                .dataSourceConfig(builder ->
                        builder.typeConvertHandler((globalConfig, typeRegistry, metaInfo) -> {
//                            if ("status".equals(metaInfo.getColumnName())) {
//                                // 返回自定义的枚举类型
//                                return DbStatusEnum.class;
//                            }
                            int typeCode = metaInfo.getJdbcType().TYPE_CODE;
                            // 添加对 TINYINT 类型的处理，转换为 Boolean
                            if (typeCode == Types.TINYINT) {
                                return DbColumnType.BOOLEAN;
                            }
                            if (typeCode == Types.SMALLINT) {
                                // 自定义类型转换
                                return DbColumnType.INTEGER;
                            }
                            return typeRegistry.getColumnType(metaInfo);
                        })
                )
                .packageConfig(builder -> {
                    builder.parent("me.ree.zkproduct") // 设置父包名
                            .moduleName("") // Mapper 接口的模块名，本项目没有分module，所以直接用空字符串
                            .pathInfo(Map.of(
                                    OutputFile.mapper, OUTPUT_ROOT_DIR+"/src/main/java/me/ree/zkproduct/mapper", // Mapper 接口的输出路径
                                    OutputFile.entity, OUTPUT_ROOT_DIR+"/src/main/java/me/ree/zkproduct/entity", // Entity 类的输出路径
                                    OutputFile.xml, OUTPUT_ROOT_DIR+"/src/main/resources/mapper", // Mapper XML 的输出路径
                                    OutputFile.service, OUTPUT_ROOT_DIR+"/src/main/java/me/ree/zkproduct/service", // Service 接口的输出路径
                                    OutputFile.serviceImpl, OUTPUT_ROOT_DIR+"/src/main/java/me/ree/zkproduct/service/impl", // Service 实现的输出路径
                                    OutputFile.controller, OUTPUT_ROOT_DIR+"/src/main/java/me/ree/zkproduct/controller" // Controller 类的输出路径
                            ));
                })
//                .strategyConfig(builder ->
//                        builder.addInclude("t_simple") // 设置需要生成的表名
//                                .addTablePrefix("t_", "c_") // 设置过滤表前缀
//                )
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板，默认的是Velocity引擎模板
                .execute();
    }
}
